package com.atguigu.gmall.all.controller;

import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.list.client.ListFeignClient;
import com.atguigu.gmall.model.list.SearchAttr;
import com.atguigu.gmall.model.list.SearchParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;

import javax.servlet.http.Cookie;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author atguigu-mqx
 */
@Controller
public class ListController {

    //  远程调用使用feign 调用！ feign 远程调用传递参数必须是 Json 格式！
    @Autowired
    private ListFeignClient listFeignClient;

    //  检索控制器 必须要接收到用户检索的条件/参数！
    //  http://list.gmall.com/list.html?category3Id=61&trademark=1:小米
    //  {"category3Id":"61","trademark"："2"}
    //  springmvc 对象传值方式： 只要传递的参数名称与实体类的属性名一致！就可以使用实体类接收
    //  @RequestBody == Json ---> javaObject
    @GetMapping("list.html")
    public String list(SearchParam searchParam, Model model) {
        //  调用远程方法
        Result<Map> result = listFeignClient.list(searchParam);

        //  SearchResponseVo 类的属性 与 ${trademarkList} ${attrsList} ${goodsList} ${pageNo}  ${totalPages } 名称一样!

        //  在实现类中 定义一个map ，key = trademarkList attrsList goodsList pageNo totalPages value = 对应的数据！
        //  map 从某种角度来讲可以用实体类来代替！ listFeignClient 远程调用调用：底层变成LinkedHasHmap
        model.addAllAttributes(result.getData());

        //  ${urlParam}  ${trademarkParam}  ${propsParamList}  ${orderMap}
        //  urlParam : 记录用户的检索条件的！
        String urlParam = this.makeUrlParam(searchParam);
        //  制作品牌面包屑： trademark=1:小米
        String trademarkParam = this.makeTradeMarkParam(searchParam.getTrademark());

        //  制作平台属性面包屑：
        //  List<SearchAttr>
        //  List<Map> propsParamList = this.makePropsParamList(searchParam.getProps());
        List<SearchAttr> propsParamList = this.makePropsList(searchParam.getProps());

        //  存储排序：
        Map<String, Object> orderMap = this.makeOrderMap(searchParam.getOrder());
        model.addAttribute("urlParam", urlParam);
        //  品牌：品牌名称
        model.addAttribute("trademarkParam", trademarkParam);
        //  平台属性面包屑： List
        model.addAttribute("propsParamList", propsParamList);
        //  存储排序
        model.addAttribute("orderMap", orderMap);
        //  ${searchParam.keyword}
        model.addAttribute("searchParam", searchParam);

        //  返回检索列表页面！
        return "list/index";
    }

    /**
     * 排序
     *
     * @param order
     * @return
     */
    private Map<String, Object> makeOrderMap(String order) {
        Map<String, Object> map = new HashMap<>();
        //  判断
        if (!StringUtils.isEmpty(order)) {
            //  分割字符串 order=2:asc  order=2:desc
            String[] split = order.split(":");
            if (split != null && split.length == 2) {

                map.put("type", split[0]);
                map.put("sort", split[1]);
            }
        } else {
            map.put("type", "1");
            map.put("sort", "desc");
        }
        return map;
    }

    /**
     * 平台属性面包屑！
     *
     * @param props
     * @return
     */
    private List<SearchAttr> makePropsList(String[] props) {
        List<SearchAttr> list = new ArrayList<>();
        //  判断
        if (props != null && props.length > 0) {
            //  循环遍历 prop = 24:256G:机身内存
            for (String prop : props) {
                //  字符串分割：
                String[] split = prop.split(":");
                if (split != null && split.length == 3) {
                    SearchAttr searchAttr = new SearchAttr();
                    //  根据页面需要的key 编写的！
                    searchAttr.setAttrId(Long.parseLong(split[0]));
                    searchAttr.setAttrValue(split[1]);
                    searchAttr.setAttrName(split[2]);
                    //  添加数据
                    list.add(searchAttr);
                }
            }
        }
        return list;
    }
    /**
     * 平台属性面包屑！
     *
     * @param props
     * @return
     */
    private List<Map> makePropsParamList(String[] props) {
        List<Map> list = new ArrayList<>();
        //  判断
        if (props != null && props.length > 0) {
            //  循环遍历 prop = 24:256G:机身内存
            for (String prop : props) {
                //  字符串分割：
                String[] split = prop.split(":");
                if (split != null && split.length == 3) {
                    HashMap<String, Object> map = new HashMap<>();
                    //  根据页面需要的key 编写的！
                    map.put("attrId", split[0]);
                    map.put("attrValue", split[1]);
                    map.put("attrName", split[2]);
                    list.add(map);
                }
            }
        }
        return list;
    }

    /**
     * 品牌面包屑
     *
     * @param trademark
     * @return
     */
    private String makeTradeMarkParam(String trademark) {
        //  判断传递的参数不为空！trademark=1:小米
        if (!StringUtils.isEmpty(trademark)) {
            //  分割字符串：
            String[] split = trademark.split(":");
            if (split != null && split.length == 2) {
                return "品牌：" + split[1];
            }
        }
        return null;
    }

    /**
     * 制作拼接的url
     *
     * @param searchParam
     * @return
     */
    private String makeUrlParam(SearchParam searchParam) {
        //  声明一个变量
        StringBuilder stringBuilder = new StringBuilder();
        //  http://list.gmall.com/list.html?category3Id=61
        //  判断用户是否通过分类Id 检索
        if (!StringUtils.isEmpty(searchParam.getCategory3Id())) {
            stringBuilder.append("category3Id=").append(searchParam.getCategory3Id());
        }

        if (!StringUtils.isEmpty(searchParam.getCategory2Id())) {
            stringBuilder.append("category2Id=").append(searchParam.getCategory2Id());
        }

        if (!StringUtils.isEmpty(searchParam.getCategory1Id())) {
            stringBuilder.append("category1Id=").append(searchParam.getCategory1Id());
        }

        //  关键词
        //  http://list.gmall.com/list.html?keyword=手机
        if (!StringUtils.isEmpty(searchParam.getKeyword())) {
            stringBuilder.append("keyword=").append(searchParam.getKeyword());
        }

        //  http://list.gmall.com/list.html?keyword=手机&trademark=1:小米
        //  判断品牌
        if (!StringUtils.isEmpty(searchParam.getTrademark())) {
            if (stringBuilder.length() > 0) {
                stringBuilder.append("&trademark=").append(searchParam.getTrademark());
            }
        }

        //  平台属性
        //  http://list.gmall.com/list.html?keyword=手机&trademark=1:小米&props=24:256G:机身内存&props=23:4G:运行内存
        String[] props = searchParam.getProps();
        if (props != null && props.length > 0) {
            //  循环遍历
            for (String prop : props) {
                if (stringBuilder.length() > 0) {
                    stringBuilder.append("&props=").append(prop);
                }
            }
        }
        //  返回对应的URL即可！
        return "list.html?" + stringBuilder.toString();
    }
}
